const fs = require('fs')

let rs = fs.createReadStream('test.txt', {
  flags:'r',// 打开/操作文件的行为标识，默认 r 代表 读取
  encoding:null,// 编码方式，默认 null，数据格式为buffer
  fd:null,// 文件描述符/文件标识，从3开始
  mode: 438,
  autoClose:true,
  start:0,// 开始读取位置
  // end:3,// 结束读取位置
  highWaterMark:4// 每次读取多少字节的数据
})

// rs.on('data', (chunk)=>{
//   console.log(chunk.toString())
//   rs.pause();// 暂停
//   // 延时1秒后取消暂停，继续读取
//   setTimeout(()=>{
//     rs.resume()
//   },1000)
// })
// 01
// 23
// 显示了01和23，原因是因为上面设置了start:0、end:3、highWaterMark:2,表示读4个字节，每次读2个字节

// 01
// 23
// 45
// 67
// 89
// 注释掉 end:3 以后，数据就会一直读取到结束。

// 01
// 使用pause方法后暂停了数据读取

// 01
// 23
// 45
// 67
// 89
// 实现效果为1秒读1次数据

// rs.on('readable', ()=>{
//   let data = null;
//   while((data = rs.read(1)) !== null){
//     console.log(data.toString())
//     console.log('---',rs._readableState.length)
//   }
// })
// <Buffer 30 31>
// <Buffer 32 33>
// <Buffer 34 35>
// <Buffer 36 37>
// <Buffer 38 39>
// null

// 01
// 23
// 45
// 67
// 89
// 排除最后的null值后的输出

// 0
// --- 3
// 1
// --- 2
// 2
// --- 1
// 3
// --- 0
// 4
// --- 3
// 5
// --- 2
// 6
// --- 1
// 7
// --- 0
// 8
// --- 1
// 9
// --- 0
// read方法中的数值，是实际每次读取的字节数
// highWaterMark属性的数值，是一次读取到缓存区中的数据大小
// 上面的场景中，数据按照highWaterMark，放入缓存区4字节，每次read，从缓存区拿走1字节，缓存区缩小1字节

// 文件打开事件open,执行时机为createReadStream之后
rs.on('open',(fd)=>{
  console.log('open事件', fd)
})

// 文件关闭事件close，执行时机为文件数据被读取完毕
rs.on('close',()=>{
  console.log('close事件,文件被关闭了')
})
let bufferArr = []
// 数据读取完毕事件end，执行时机为数据被消费完毕
rs.on('end',()=>{
  console.log('end事件，数据被清空了')
  console.log('最终读取的数据',Buffer.concat(bufferArr))
  // 最终读取的数据 <Buffer 30 31 32 33 34 35 36 37 38 39>
})

rs.on('data',(chunk)=>{
  console.log('data事件',chunk.toString())
  bufferArr.push(chunk)
})
// open事件 3
// data事件 0123
// data事件 4567
// data事件 89
// end事件，数据被清空了
// close事件,文件被关闭了

// 错误事件
rs.on('error',(err)=>{
  console.log('error出错了')
})
// error出错了
// close事件,文件被关闭了
